package com.zyx.tl.demo02.utils;


import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class JdbcUtils {
    private static final ThreadLocal<Connection> TL = new ThreadLocal<>();
    /** hikari数据库连接池对象属性 */
    private static final Properties PROP = new Properties();
    private static HikariDataSource ds = null;

    static {
        try {
            PROP.load(JdbcUtils.class.getClassLoader().getResourceAsStream("hikari.properties"));
            HikariConfig config = new HikariConfig(PROP);
            ds = new HikariDataSource(config);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     * 原本: 直接从连接池中获取连接
     * 现在:
     *       1. 直接获取当前线程绑定的连接对象
     *       2. 如果连接对象是空的
     *           2.1 再去连接池中获取连接
     *           2.2 将此连接对象跟当前线程进行绑定
     */
    public static Connection getConnection() throws SQLException {
        Connection conn = TL.get();
        if(conn == null){
            conn = ds.getConnection();
            TL.set(conn);
        }
        return conn;
        // return ds.getConnection();
    }

    // 释放资源
    public static void release(AutoCloseable... ios){
        for (AutoCloseable io : ios) {
            if(io != null){
                try {
                    io.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void commitAndClose(Connection conn) {
        try {
            if(conn != null){
                // 提交事务
                conn.commit();
                // 解绑当前线程绑定的连接对象, 防止内存泄漏
                TL.remove();
                // 释放连接
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void rollbackAndClose(Connection conn) {
        try {
            if(conn != null){
                // 回滚事务
                conn.rollback();
                // 解绑当前线程绑定的连接对象, 防止内存泄漏
                TL.remove();
                // 释放连接
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}
